package modelo.adaptadores;

import java.net.URI;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;

import modelo.datos.Direccion;
import modelo.datos.Empresa;
import modelo.datos.Entrada;
import modelo.datos.Persona;
import modelo.datos.Telefono;

public class EntradaAdapter extends XmlAdapter<EntradaAdapter.AdaptedEntrada, Entrada> {

	@Override
	public AdaptedEntrada marshal(Entrada entrada) throws Exception {
		if(entrada == null) return null;
		AdaptedEntrada adaptedEntrada = new AdaptedEntrada();
		if(entrada instanceof Persona) {
			Persona persona = (Persona)entrada;
			adaptedEntrada.nombre = persona.getNombre();
			adaptedEntrada.apellidos = persona.getApellidos();
			adaptedEntrada.nif = persona.getNif();
			adaptedEntrada.direccion = persona.getDireccion();
			adaptedEntrada.telefonos = persona.getTelefonos();
			adaptedEntrada.self = persona.getSelf();
			adaptedEntrada.parent = persona.getParent();
		} else {
			Empresa empresa = (Empresa)entrada;
			adaptedEntrada.nombre = empresa.getNombre();
			adaptedEntrada.nif = empresa.getNif();
			adaptedEntrada.direccion = empresa.getDireccion();
			adaptedEntrada.telefonos = empresa.getTelefonos();
			adaptedEntrada.self = empresa.getSelf();
			adaptedEntrada.parent = empresa.getParent();
		}
		return adaptedEntrada;
	}

	@Override
	public Entrada unmarshal(AdaptedEntrada adaptedEntrada) throws Exception {
		if(adaptedEntrada == null) return null;
		if(adaptedEntrada.apellidos != null) {
			Persona persona = new Persona();
			persona.setNombre(adaptedEntrada.nombre);
			persona.setApellidos(adaptedEntrada.apellidos);
			persona.setNif(adaptedEntrada.nif);
			persona.setDireccion(adaptedEntrada.direccion);
			persona.setTelefonos(adaptedEntrada.telefonos);
			persona.setSelf(adaptedEntrada.self);
			persona.setParent(adaptedEntrada.parent);
			return persona;
		} else {
			Empresa empresa = new Empresa();
			empresa.setNombre(adaptedEntrada.nombre);
			empresa.setNif(adaptedEntrada.nif);
			empresa.setDireccion(adaptedEntrada.direccion);
			empresa.setTelefonos(adaptedEntrada.telefonos);
			empresa.setSelf(adaptedEntrada.self);
			empresa.setParent(adaptedEntrada.parent);
			return empresa;
		}
	}
	
	@XmlRootElement(name="entrada")
	public static class AdaptedEntrada {
		@XmlElement
		public String nombre;
		@XmlElement
		public String apellidos;
		@XmlElement
		public String nif;
		@XmlElement
		public Direccion direccion;
		@XmlElementWrapper(name = "telefonos")
		@XmlElement(name = "telefono")
		public List<Telefono> telefonos;
		@XmlElement
		private URI self;
		@XmlElement
		private URI parent;
	}
}
